import { Plugin, ResolvedConfig } from 'vite';

/**
 * 加载虚拟模块
 */
export default function virtualModule(): Plugin {
  const module1 = 'virtual:fib';
  // Vite 中约定对于虚拟模块，解析后的路径需要加上`\0`前缀
  const virtualModuleId1 = '\0' + module1;

  const module2 = 'virtual:env';
  const virtualModuleId2 = '\0' + module2;

  let config: ResolvedConfig;

  return {
    name: 'vite-plugin-virtual-module',

    resolveId(source) {
      // 解析虚拟模块
      if (source === module1) {
        return virtualModuleId1;
      }

      if (source === module2) {
        return virtualModuleId2;
      }
    },

    configResolved(cfg) {
      // 存储最终配置
      config = cfg;
    },

    load(id) {
      if (id === virtualModuleId1) {
        // 通过字符串的方式返回模块内容
        return 'export function fib(n){ return n <= 1 ? n : fib(n-1) + fib(n-2) }';
      }

      if (id === virtualModuleId2) {
        // 获取环境变量作为模块内容
        return `export const env = '${JSON.stringify(config.env)}'`;
      }
    },
  };
}
